package com.changgou.pay.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author tang.qingbo
 * @Date 2020/9/7 23:30
 * @Version 1.0
 */
@Configuration
public class RabbitMQConfig {

    @Value("${mq.pay.queue.order}")
    private String queue;

    @Value("${mq.pay.exchange.order}")
    private String exchange;

    @Value("${mq.pay.routing.key}")
    private String routingKey;

    /**
     * 创建队列
     */
    @Bean(name = "queueOrder")
    public Queue queueOrder() {
        /**
         * 参数1: 从配置文件中获取队列名
         * 参数2: 是否持久化
         */
        return new Queue(queue, true);
    }

    /**
     * 创建交换机
     */
    @Bean(name = "orderExchange")
    public Exchange orderExchange() {
        /**
         * 参数1: 获取配置文件中的交换机名
         * 参数2: 是否持久化
         * 参数3: 是否自动删除
         */
        return new DirectExchange(exchange, true, false);
    }

    /**
     * 队列绑定交换机
     */
    @Bean
    public Binding queueBindExchange(@Qualifier("queueOrder") Queue queue,@Qualifier("orderExchange") Exchange exchange) {
        /**
         * 直接调用创建队列创建交换机的方法获取队列和交换机,并将队列绑定到交换机上
         */
        return BindingBuilder.bind(queue).to(exchange).with(routingKey).noargs();
    }

    /**
     * 秒杀支付状态队列
     */
    @Bean(name = "queueSeckillOrder")
    public Queue queueSeckillOrder() {
        return QueueBuilder.durable("queueSeckillOrder").build();
    }

    /**
     * 秒杀支付状态队列绑定交换机
     */
    @Bean
    public Binding seckillQueueBindExchange(@Qualifier("queueSeckillOrder") Queue queue,@Qualifier("orderExchange") Exchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("queueSeckillOrder").noargs();
    }
}
